package gestionBDD;

import java.sql.* ;
import java.util.Iterator;
import java.util.List;

import interne.Album;
import interne.Contient;
import interne.Image;

public class requetesContient {
	
	/*
	 * Ajoute une entrée dans la table Contient
	 * Entrée : Objet Contient avec tous les attributs remplis sauf id_contient 
	 */
	public static void ajouterContient(Contient c) throws SQLException {
		try {
			String sql = "INSERT INTO CONTIENT (id_album, id_image, ordre, titre_image, commentaire) VALUES(?,?,?,?,?)";
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, c.getIdAlbum());
			statement.setObject(2, c.getIdImage());
			statement.setObject(3, c.getOrdre());
			statement.setObject(4, c.getTitreImage());
			statement.setObject(5, c.getCommentaire());
			statement.executeUpdate();
			statement.close();
			accesBDD.getInstance().commit();
		}
		catch(SQLException e) {
			System.out.println("ajouterContient() : " + e) ;
		}
	}
	
	/*
	 * Met à jour une entrée de la table Contient
	 * Entrée : Objet client avec tous les attributs
	 */
	public static void modifierContient(Contient c) throws SQLException {
		try {
			String sql = "UPDATE CONTIENT SET ordre = ?, commentaire = ?, titre_image = ? WHERE id_contient = ?";
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, c.getOrdre());
			statement.setObject(2, c.getCommentaire());
			statement.setObject(3, c.getTitreImage());
			statement.setObject(4, c.getIdContient());
			statement.executeUpdate();
			statement.close();
			accesBDD.getInstance().commit();
		}
		catch(SQLException e) {
			System.out.println(e) ;
		}
	}
	
	/*
	 * Supprime une entrée de la table Contient, si une image n'est plus référencé, elle est supprimée aussi
	 * Entrée : Objet Commande avec id_contient
	 */
	public static void supprimerContient(Contient c) throws SQLException {
		try {
			String sql = "DELETE FROM CONTIENT where id_contient = ?" ;
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, c.getIdContient());
			statement.executeUpdate();
			statement.close();
			Image image = new Image(c.getIdImage());
			if (requetesContient.estReference(image) == false) {
				System.out.println("COUCOU4");
				requetesImage.supprimerImage(image) ;
			}
			System.out.println("COUCOU3");
			accesBDD.getInstance().commit();

		}
		catch(Exception e) {
			System.out.println(e) ;
		}
	}
	
	/*
	 * Cherche une image est reférencé dans un album
	 * Entrée : Objet Image avec id_image
	 * Infos : Méthode appelée à la suppression d'une entrée contient.
	 */
	public static Boolean estReference(Image i) throws SQLException {
		try {
			String sql = "SELECT * FROM CONTIENT where id_image = ?" ;
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, i.getIdImage());	
	        ResultSet rs = statement.executeQuery();
	        return rs.next();
		}
		catch(SQLException e) {
			System.out.println(e) ;
			return true ;
		}
	}
	
	/*
	 * Remplit un objet Contient avec tous les attributs
	 * Entrée : Objet Contient avec id_contient
	 */
	public static Contient trouverAvecId(Contient c) throws SQLException {
		try {
			String sql = "SELECT * FROM CONTIENT WHERE id_contient = ?" ;
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, c.getIdContient());
            ResultSet rs = statement.executeQuery();
            rs.next();
            c.setIdImage(rs.getInt("ID_IMAGE"));
            c.setIdAlbum(rs.getInt("ID_ALBUM"));
            c.setTitreImage(rs.getString("TITRE_IMAGE"));
            c.setCommentaire(rs.getString("COMMENTAIRE"));
            c.setOrdre(rs.getInt("ORDRE"));
			statement.close();
			return c ;			
		}
		catch(Exception e) {
			System.out.println(e) ;
			return null ;
		}
	}
	
	/*
	 * Lors de l'ajout d'une photo dans un album, l'ordre de la nouvelle photo doit être cohérent
	 * Entrée : Objet avec id_album et id_contient
	 * Infos : Méthode appelée dès l'ajout/upload d'une photo
	 */
	public static void corrigerOrdre(Contient c) throws SQLException {
		try {
			String sql = "SELECT MAX(ordre) FROM CONTIENT, ALBUM WHERE CONTIENT.id_album = ALBUM.id_album AND CONTIENT.id_album = ?" ;
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, c.getIdAlbum());
            ResultSet rs = statement.executeQuery();
            rs.next();
            Integer ordreMax = rs.getInt(1);
            
            sql = "UPDATE CONTIENT SET ORDRE = ? WHERE id_contient = ?";
			statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, ordreMax+1);
			statement.setObject(2, c.getIdContient());
			statement.executeUpdate();
			statement.close();
			accesBDD.getInstance().commit();
		}
		catch(SQLException e) {
			System.out.println(e);
		}
	}
	
	/*
	 * Construit un objet contient et le retourne
	 * Entrée : Contient avec id_album et id_image
	 * Infos : Utile pour trouver id_contient
	 */
	public static Contient trouverId(Contient contient) throws SQLException {
		try {
			String sql = "SELECT * FROM CONTIENT WHERE id_album = ? AND id_image = ?" ;
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, contient.getIdAlbum());
			statement.setObject(2, contient.getIdImage());
	        ResultSet rs = statement.executeQuery();
	        rs.next();
	        contient.setIdContient(rs.getInt("ID_CONTIENT")) ;
	        contient.setTitreImage(rs.getString("TITRE_IMAGE")) ;
	        contient.setCommentaire(rs.getString("COMMENTAIRE")) ;
	        return contient;
		}
		catch(SQLException e) {
			System.out.println(e);
			return null;
		}
	}	
	
	/*
	 * Retourne le titre d'une photo
	 * Entrée : Entier id_contient
	 */
	public static String retourneTitreImage(Integer idContient) throws SQLException {
		try {
			String sql = "SELECT * FROM CONTIENT WHERE id_contient = ?" ;
			PreparedStatement statement = accesBDD.getInstance().prepareStatement(sql);
			statement.setObject(1, idContient);
	        ResultSet rs = statement.executeQuery();
	        rs.next();
	        return rs.getString("TITRE_IMAGE") ;
		}
		catch(SQLException e) {
			System.out.println(e);
			return null;
		}
	}
	/**
	 * 
	 */
	public static void supprimerContientAlbum(Album a) throws SQLException {
		try {
			List<Contient> listePhotos = extractionBDD.extrairePhotos(a) ;
			Iterator<Contient> ite = listePhotos.iterator();
			while (ite.hasNext()) {
			    Contient photo = ite.next();
			    requetesContient.supprimerContient(photo);
			}
		}
		catch(SQLException e) {
			System.out.println("supprimerContenusAlbum() : " + e);
		}
			System.out.println("COUCOU2");

	}
	
}
